﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace DADOS.usuario
{
    public class metPaciente
    {
        private SqlConnection _conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_PROAD_SQL"].ConnectionString);

        DB_PROAD banco = new DB_PROAD();

        private void FecharConexao(object banco)
        {
            ((DB_PROAD)banco).Connection.Close();
        }

        private void InicializarConexao(object banco)
        {
            ((DB_PROAD)banco).Connection.Open();
        }

        /// <summary>
        /// Incluir paciente
        /// </summary>
        /// <param name="objPro"></param>
        public void Incluir(TB_USUARIO objUser)
        {
            try
            {
                InicializarConexao(banco);
                banco.AddToTB_USUARIO(objUser);
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Alterar Paciente e grava log
        /// </summary>
        /// <param name="objUser"></param>
        public void Alterar(TB_USUARIO objUser)
        {
            try
            {
                InicializarConexao(banco);

                var objUserAlt = banco.TB_USUARIO.Where(q => q.CO_USUARIO == objUser.CO_USUARIO).FirstOrDefault();

                objUserAlt.CO_CIDADE = objUser.CO_CIDADE;
                objUserAlt.CO_ES = objUser.CO_ES;
                objUserAlt.CO_PROFISSIONAL = objUser.CO_PROFISSIONAL;
                objUserAlt.DS_CEP = objUser.DS_CEP;
                objUserAlt.DS_CPF = objUser.DS_CPF;
                objUserAlt.DS_ENDERECO = objUser.DS_ENDERECO;
                objUserAlt.DS_TELEFONE = objUser.DS_TELEFONE;
                objUserAlt.DT_ATUALIZACAO = objUserAlt.DT_ATUALIZACAO;
                objUserAlt.DT_NASCIMENTO = objUser.DT_NASCIMENTO;
                objUserAlt.NO_NOME = objUser.NO_NOME;
                objUserAlt.NR_SEXO = objUser.NR_SEXO;
                objUserAlt.NR_STATUS = objUser.NR_STATUS;

                var objLog = new TB_USUARIO_LOG();

                objLog.CO_PROFISSIONAL = objUser.CO_PROFISSIONAL;
                objLog.CO_USUARIO = objUser.CO_USUARIO;
                objLog.DT_ALTERACAO = DateTime.Now;

                banco.SaveChanges();

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public void MigrarPaciente(int intCodPaciente, int intCodEs)
        {
            try
            {
                InicializarConexao(banco);

                var objUserAlt = banco.TB_USUARIO.Where(q => q.CO_USUARIO == intCodPaciente).FirstOrDefault();


                objUserAlt.CO_ES = intCodEs;
                
                //var objLog = new TB_USUARIO_LOG();

                //objLog.CO_PROFISSIONAL = intCodProf;
                //objLog.CO_USUARIO = intCodPaciente;
                //objLog.DT_ALTERACAO = DateTime.Now;

                banco.SaveChanges();


            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Retorna um dataSet de pacientes
        /// </summary>
        /// <returns></returns>
        
        public DataSet ListarPacientes(string strNome, string strCpf, int intSexo, int intStatus, int codProf)
        {
            DataSet ds = new DataSet();

            string Query = "SELECT DISTINCT USUA.CO_USUARIO, USUA.NO_NOME ";
            Query += ",USUA.DS_CPF ";
            Query += ",USUA.DT_NASCIMENTO ";
            Query += ",USUA.NR_STATUS ";
            Query += ",CASE (NR_SEXO) ";
            Query += "WHEN 1 THEN ";
            Query += "'Masculino' ";
            Query += "ELSE ";
            Query += "'Feminino' ";
            Query += "END AS SEXO ";
            Query += "FROM TB_USUARIO AS USUA ";
            Query += "INNER JOIN TB_PROFISSIONAL AS PROF ";
            Query += "ON USUA.CO_PROFISSIONAL = PROF.CO_PROFISSIONAL ";
            Query += "WHERE 1 = 1";

            var ListAloc = banco.TB_ALOCACAO_PROF.Where(q => q.CO_PROFISSICIONAL == codProf).ToList();

            if (ListAloc.Count > 0)
            {
                Query += " AND (";

                int count = 0;
                
                foreach (var objAloc in ListAloc)
                {
                    if (count == 0)
                    {
                        Query += "USUA.CO_ES = " + objAloc.CO_ES;
                    }else
                    {
                        Query += " OR USUA.CO_ES = " + objAloc.CO_ES;
                    }
                    count++;
                }
                Query += " )";
            }


            if (!string.IsNullOrEmpty(strNome))
            {
                Query += " AND USUA.NO_NOME LIKE '%" + strNome + "%'";
            }

            if (!string.IsNullOrEmpty(strCpf) && strCpf != "___.___.___-__")
            {
                Query += " AND USUA.DS_CPF = '" + strCpf + "'";
            }

            if (intSexo > 0)
            {
                Query += " AND USUA.NR_SEXO = " + intSexo;
            }

            if (intStatus != 7)
            {
                Query += " AND USUA.NR_STATUS = 1";
            }
            Query += " ORDER BY USUA.NO_NOME";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }

        public TB_USUARIO getUsuarioByCod(int codUser)
        {
            try
            {
                InicializarConexao(banco);
                var objUser = banco.TB_USUARIO.Where(q => q.CO_USUARIO == codUser).FirstOrDefault();

                return objUser;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public TB_USUARIO getUsuarioByCpf(string strCpf)
        {
            try
            {
                InicializarConexao(banco);
                var objUser = banco.TB_USUARIO.Where(q => q.DS_CPF == strCpf).FirstOrDefault();

                return objUser;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public Boolean LiberarGestaoCuidado(int intCodPaciente)
        {
            try
            {
                InicializarConexao(banco);
                var objAna = banco.TB_ANAMNESE.Where(q => q.CO_USUARIO == intCodPaciente).FirstOrDefault();
                var objAvd = banco.TB_AVD.Where(q => q.CO_USUARIO == intCodPaciente).FirstOrDefault();
                var objCont = banco.TB_CONTEXTO.Where(q => q.CO_USUARIO == intCodPaciente).FirstOrDefault();
                var objClas = banco.TB_CLASSIFICACAO_FINAL.Where(q => q.CO_USUARIO == intCodPaciente).FirstOrDefault();

                if (objAna != null && objAvd != null && objCont != null && objClas != null)
                {
                    return true;
                }else
                {
                    return false;
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public List<TB_USUARIO> ListaUsuarios()
        {
            try
            {
                InicializarConexao(banco);
                var objUser = banco.TB_USUARIO.ToList();

                return objUser;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        //public DataSet RetornarPaciente(int codPaciente)
        //{
        //    DataSet ds = new DataSet();

        //    string Query = "SELECT [CO_USUARIO] ";
        //           Query +="               ,[NO_NOME] ";
        //           Query +="                    ,USUA.DS_CPF ";
        //           Query +="                    ,UF.NO_UF ";
        //           Query +="                    ,CITY.NO_CIDADE ";
        //           Query +="                    ,USUA.DS_ENDERECO ";
        //           Query +="                    ,USUA.DS_CEP ";
        //           Query +="                    ,[DT_NASCIMENTO] ";
        //           Query +="                    ,USUA.DS_TELEFONE ";
        //           Query +="                    ,PROF.NO_PROFISSIONAL ";
        //           Query +="                    , ES.NO_ES ";
        //           Query +="                    ,US.NO_US ";
        //           Query +="                    ,CASE USUA.NR_SEXO WHEN ";
        //           Query +="                    '2' THEN 'Feminino' ";
        //           Query +="                    ELSE ";
        //           Query +="                     'Masculino' ";
        //           Query +="                    END AS SEXO ";
        //           Query +="                    ,CASE USUA.NR_STATUS WHEN  ";
        //           Query +="                    '1' THEN 'Ativo' ";
        //           Query +="                    ELSE ";
        //           Query +="                     'Inativo' ";
        //           Query +="                    END AS SITUACAO ";
        //           Query +="                FROM [DB_PROAD].[dbo].[TB_USUARIO] AS USUA ";
        //           Query +="                INNER JOIN DB_PROAD..TB_CIDADE AS CITY ";
        //           Query +="                ON CITY.CO_CIDADE = USUA.CO_CIDADE ";
        //           Query += "                INNER JOIN DB_PROAD..TB_ES AS ES ";
        //           Query +="                ON ES.CO_ES = USUA.CO_ES ";
        //           Query +="                INNER JOIN DB_PROAD..TB_US AS US ";
        //           Query +="                ON US.CO_US = ES.CO_US ";
        //           Query +="                INNER JOIN DB_PROAD..TB_UF AS UF ";
        //           Query +="                ON UF.CO_UF = CITY.CO_UF ";
        //           Query +="                INNER JOIN DB_PROAD..TB_PROFISSIONAL AS PROF ";
        //           Query +="                ON PROF.CO_PROFISSIONAL = USUA.CO_PROFISSIONAL";
        //           Query += " WHERE USUA.CO_USUARIO = " + codPaciente;

 

        //    SqlCommand cmd = new SqlCommand(Query, _conexao);

        //    cmd.Connection = _conexao;

        //    if (_conexao.State == ConnectionState.Closed)
        //    {
        //        _conexao.Open();
        //    }
        //    SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
        //    dataAdapter.Fill(ds);

        //    _conexao.Close();

        //    return ds;
        //}

        public DataSet ListarPacientesPorLocalidade(int intCodUf, int intCodMun)
        {
            DataSet ds = new DataSet();

            string Query = "SELECT DISTINCT USUA.CO_USUARIO, USUA.NO_NOME ";
            Query += ",USUA.DS_CPF ";
            Query += ",USUA.DT_NASCIMENTO ";
            Query += ",USUA.NR_STATUS ";
            Query += ",CASE (NR_SEXO) ";
            Query += "WHEN 1 THEN ";
            Query += "'Masculino' ";
            Query += "ELSE ";
            Query += "'Feminino' ";
            Query += "END AS SEXO ";
            Query += "        ,CID.NO_CIDADE ";
            Query += "        ,UF.NO_SIGLA ";
            Query += "        ,ES.CO_ATENCAO_SUS ";
            Query += "FROM TB_USUARIO AS USUA ";
            Query += "INNER JOIN TB_ES AS ES ";
            Query += " ON ES.CO_ES = USUA.CO_ES ";
            Query += "INNER JOIN TB_CIDADE AS CID ";
            Query += "ON CID.CO_CIDADE = USUA.CO_CIDADE ";
            Query += "INNER JOIN TB_UF AS UF ";
            Query += "ON CID.CO_UF = UF.CO_UF ";
            Query += "WHERE 1 = 1";

            if (intCodUf > 0)
            {
                Query += " AND UF.CO_UF = " + intCodUf;
            }

            if (intCodMun > 0)
            {
                Query += " AND CID.CO_CIDADE = " + intCodMun;
            }
            Query += " ORDER BY USUA.NO_NOME";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }
    }
}
